package com.zxl.designpattern.structure.proxy;

/**
 * @author zxl
 * @version 1.0
 * @description 代理模式测试类
 * @date 2025/6/1 14:22
 */
public class Test {
    public static void main(String[] args) {
        staticProxy();
        jdkDynamicProxy();
        // 如果你的JDK是9及以上的版本，需要在启动参数中添加如下配置，否则会报错
        // --add-opens java.base/java.lang=ALL-UNNAMED
        cglibDynamicProxy();
    }

    /**
     * 静态代理
     */
    public static void staticProxy() {
        // 销售接待一个叫张三的客户，协助客户购买一辆奥迪A4L
        CarPurchase proxy = new CarDealerProxy("张三");
        proxy.purchase("奥迪A4L");
    }

    /**
     * jdk动态代理
     */
    public static void jdkDynamicProxy() {
        // 在框架中，这是一个归Spring管理的bean，并不需要每次都new
        CarPurchase carPurchase = new Customer("李四");
        // 通过代理工厂获取代理对象，协助客户购买一辆宝马X5
        CarPurchase proxy = ProxyFactory.getProxy(carPurchase);
        proxy.purchase("宝马X5");
    }

    /**
     * cglib动态代理
     */
    public static void cglibDynamicProxy() {
        // 通过代理工厂获取代理对象，协助客户购买一辆宝马X5
        CarBuyer proxy = CglibProxyFactory.createProxy(CarBuyer.class, "王五");
        proxy.purchase("梅赛德斯");
    }
}
